/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.servinf.ani.comparator;

import com.servinf.ani.mapper.ProjectMapper;
import com.servinf.ani.sincronizador.App;
import com.servinf.ani.sincronizador.entities.Proyecto;
import com.servinf.ani.sincronizador.entities.ProyectosXDepartamento;
import com.servinf.ani.sincronizador.exception.IncompatibleTypesException;
import com.servinf.ani.sincronizador.service.ProjectByDepartmentService;
import com.servinf.ani.sincronizador.service.ProjectService;
import com.servinf.ani.sincronizador.utils.LogHelper;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 *
 * @author mortiz
 */
public class ProjectComparator {
        
    /**
    *   Método que compara las listas de objetos 
    */
    public static void compareList(List<List<Object>> excelList, List<Proyecto> jpaList) throws IOException {
        LogHelper.Log(LogHelper.INFO, "Inicia sincronización de proyectos Excel vs BD", null);
        ProjectService projectService = (ProjectService) App.getContext().getBean("projectService");
        for(int i = 1; i < excelList.size(); i++)  {  //Inicia en 1 porque la fila 0 es de header de las columnas.
            if(validatePRojectNullable(excelList.get(i))) { //Valida campos obligatorios para crear un proyecto
                boolean found = false;
                for(Proyecto project : jpaList) {
                    if(isEntityInDB(excelList.get(i), project)) {
                       LogHelper.Log(LogHelper.INFO, "ACTUALIZANDO el proyecto " +  project.toString(), null);
                       //Información por departamento (Inversión, Kilometraje)
                       ProjectByDepartmentService projectByDepartmentService = (ProjectByDepartmentService) App.getContext().getBean("projectByDepartmentService");
                       List<ProyectosXDepartamento> proyectosXDepartamentos = projectByDepartmentService.findByProjectId(project.getIdProyecto());
                       project.setProyectosXDepartamentoList(proyectosXDepartamentos);
                        try {
                            projectService.update(excelList.get(i), project);
                        } catch (IncompatibleTypesException ex) {
                           LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
                        }
                       found = true;
                       break;
                    }
                }
                if(found) { //Si se encontro el proyecto, ya se tuv que haber acutalizado
                    continue;
                }else {
                    LogHelper.Log(LogHelper.INFO, "CREANDO el proyecto " + excelList.get(i).get(ProjectMapper.IdDelProyecto) + " --> " + excelList.get(i).get(ProjectMapper.NombreDeProyecto), null);
                    try {
                        //Proyecto project = new Proyecto();
                        projectService.create(excelList.get(i));
                    } catch (IncompatibleTypesException ex) {
                       LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
                    }
                }
            }
        }
    }
    
    /**
     * Mediante la comparación de ids de dos entidades (Excel vs DB) se determina si existe o si es un registro 
     * nuevo que debe crearse.
     * @param excelEntity Entidad leida desde excel
     * @param jpaEntity Entidad leida desde la base de datos.
     * @return 
     */
    public static boolean isEntityInDB(List<Object> excelEntity, Proyecto jpaEntity) {
        String excelId = "";
        if(excelEntity.get(ProjectMapper.IdDelProyecto) != null) {
            excelId = (String) excelEntity.get(ProjectMapper.IdDelProyecto);
        }
        String projectOnlineId = jpaEntity.getIdEnProject();
        boolean found = excelId.trim().equals(projectOnlineId.trim());
        //System.out.println(excelId + " == " + projectOnlineId + "?");
        //System.out.println(((excelId.trim().equals(projectOnlineId.trim()))?"Si":"No"));
        return found;
    }

    /**
     * Valida que en excel vengan los campos obligatorios para actualizar/crear un 
     * proyecto
     * @param row
     * @return 
     */
    private static boolean validatePRojectNullable(List<Object> row) {
        if(row.get(ProjectMapper.IdDelProyecto) != null &&
           row.get(ProjectMapper.NombreDeProyecto) != null && 
           row.get(ProjectMapper.GeneracióndelContrato) != null &&
           row.get(ProjectMapper.EstadodelProyecto) != null) {
            return true;
        }
        return false;
    }
}
